'use strict'

var xml2js = require('xml2js');
var Promise = require('bluebird');

// 引入要返回给用户的 xml 模板
var tpl = require('./tpl');

/**
 * 把 xml 字符串转为 json 对象
 * @param xml
 * 返回值是一个 Promise 对象
 */
exports.parseXMLAsync = function(xml){
	return new Promise(function(resolve, reject){
		xml2js.parseString(xml, {trim: true}, function(err, data){
			if (err) {
				reject(err);
			} else {
				resolve(data);
			}
		});
	});
};

// 把 from to 等的键值，由数组转为字符串，考虑到嵌套的情况，需要递归
/*
{
	from: ['xxx'],
	to: ['xxx'],
	...
}
*/
/**
 *
 * @param data 使用 xml2js 处理后的返回值
 * 这里只针对微信服务器信息进行处理，并不通用
 * @returns {{}}
 */
function formatMessage(data)
{
	var message = {};
	// 实实在在的对象，不是数组，因为data不可能是数组
	if (typeof data === 'object') {
		var keys = Object.keys(data);
		for (var i = 0; i < keys.length; i++) {
			var item = data[keys[i]];
			var key = keys[i];
			if (!(item instanceof Array) || item.length == 0) {
				continue;
			}
			if (item.length == 1) {
				var val = item[0];
				if (typeof val === 'object') {
					message[key] = formatMessage(val);
				} else {
					message[key] = (val || '').trim();
				}
			} else {
				message[key] = [];
				for (var j = 0; j < item.length; j++) {
					message[key].push(formatMessage(item[j]));
				}
			}
		}
	}
	return message;
}

exports.formatMessage = formatMessage;

/**
 * 传递参数给模板（./wechat/tpl.js）
 * 模板组装成 xml 字符串
 *
 * @param content 给用户返回不同信息需要的不同的参数
 * @param message 经由微信服务器推送来的 xml 消息，经过 xml2js 处理后并进行二次处理（formatMessage函数）的 json 格式数据
 * 返回的是 xml 字符串
 */
exports.tpl = function(content, message){
	var info = {};
	var type = 'text';//默认返回信息的类型，文本。
	var fromUserName = message.fromUserName;
	var toUserName = message.toUserName;

	// 如果参数content是一个数组，表示要返回给用户的是一个图文消息。
	if (Array.isArray(content)) {
		type = 'news';
	}
	type = content.type || type;
	info.content = content;
	info.createTime = (new Date()).getTime();
	info.msgType = type;
	info.toUserName = toUserName;
	info.fromUserName = fromUserName;
	return tpl.compiled(info);
};

